﻿#ifndef __GAF_DEFINE_H__
#define __GAF_DEFINE_H__

#include "GAF_Setting.h"
#include "GAF_SysIncDef.h"
#include "GAF_Type.h"

#pragma WARNING(disable:4100)		// 忽略未引用形参警告

// ****** 常数状态 ******
/// 空值
#ifndef NULL
#define NULL				0
#endif

/// 不限画面更新次数
#define GAF_FPS_NONE			0
/// 默认画面更新次数
#define GAF_FPS_DEFAULT			50

// ****** 操作 ******
/// 绝对值操作
#define GAF_ABS_NUM(_nNum)		((_nNum) >=0 ? (_nNum) : -(_nNum))
/// 最大值操作
#define GAF_MAX_NUM(_nNum1, _nNum2)	(((_nNum1) > (_nNum2)) ? (_nNum1) : (_nNum2))
/// 最小值操作
#define GAF_MIN_NUM(_nNum1, _nNum2)	(((_nNum1) < (_nNum2)) ? (_nNum1) : (_nNum2))
/// 中间值操作
#define GAF_MID_NUM(_nNum1, _nNum2)	(((_nNum1) + (_nNum2)) >> 1)
/// 类型判断操作
#define GAF_KINDOF(_TYPE1, _TYPE2)	(typeid(_TYPE1) == typeid(_TYPE2))

/// 打位标记操作
#define GAF_DOMARK(_bState, _nID)	((_bState) |= (0x1 << (_nID)))
/// 撤销位标记操作
#define GAF_UNMARK(_bState, _nID)	((_bState) &= ~(0x1 << (_nID)))
/// 查看位标记操作
#define GAF_ISMARK(_bState, _nID)	((((_bState) >> (_nID)) & 0x1) == 0x1)


// ****** 父类 ******
/// 父类指针
#define SUPER(_KIND)			((_KIND*)this)
/// 父类对象访问
#define BASE(_KIND)			_KIND::


// ****** 属性定义 ******
/// 属性成员变量
#define ATTRIB(_Name)			m_atb##_Name

/// 定义只读属性
#define DIM_ATTRIB_R(_TYPE, _Name) \
	protected: \
		_TYPE ATTRIB(_Name); \
	public: \
		virtual inline _TYPE& Get##_Name() {return ATTRIB(_Name);}
/// 定义属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB(_TYPE, _Name) \
		DIM_ATTRIB_R(_TYPE, _Name) \
		virtual inline void Set##_Name(_TYPE val) {ATTRIB(_Name) = val;}

/// 定义只读数组属性
#define DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
	protected: \
		_TYPE ATTRIB(_Name)[_nSize]; \
	public: \
		virtual inline _TYPE*& Get##_Name() {return ATTRIB(_Name);}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ARRAY(_TYPE, _Name, _nSize) \
		DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
		virtual inline void Set##_Name(_TYPE* pval) \
		{ \
			for(int _i = 0; _i < _nSize; _i++) \
				ATTRIB(_Name)[_i] = pval[_i]; \
		}

/// 定义只读关联属性
#define DIM_ATTRIB_ASSOCIATED_R(_TYPE, _Name, _Arg) \
	public: \
		virtual inline _TYPE& Get##_Name() {return _Arg;}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ASSOCIATED(_TYPE, _Name, _Arg) \
		DIM_ATTRIB_ASSOCIATED_R(_TYPE, _Name, _Arg) \
		virtual inline void Set##_Name(TYPE _val) {_Arg = _val;}

// ****** 调试状态 ******
#include "GAF_Log.h"
#include "GAF_Debug.h"


// ****** 内存机制 ******
#include "GAF_MemManage.h"


// ****** 颜色格式 ******
/// ARGB格式颜色
#define GAF_ARGB_32(_a, _r, _g, _b)	(((BYTE)(_a)) << 24 | ((BYTE)(_r)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_b)) << 0)
/// RGB格式颜色
#define GAF_RGB_24(_r, _g, _b)		(((BYTE)(_r)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_b)) << 0)
/// BGR格式颜色
#define GAF_BGR_24(_r, _g, _b)		(((BYTE)(_b)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_r)) << 0)

// ****** 快速创建 ******
namespace GAF
{
	inline Point			CreatePoint(int x, int y);
	inline Size			CreateSize(UINT width, UINT height);
	inline Rect			CreateRect(int x, int y, UINT width, UINT height);
	inline Colour			CreateColour(BYTE red, BYTE green, BYTE blue, BYTE Alpha = 255);
}
#define GAF_CREATE_POINT		GAF::CreatePoint
#define GAF_CREATE_SIZE			GAF::CreateSize
#define GAF_CREATE_RECT			GAF::CreateRect
#define GAF_CREATE_COLOUR		GAF::CreateColour

// ****** 常用类型参数格式 ******
/// 点参数格式
#define GAF_ARG_POINT(_point)		_point.nX, _point.nY
/// 尺寸参数格式
#define GAF_ARG_SIZE(_size)		_size.nWidth, _size.nHeight
/// 矩形参数格式
#define GAF_ARG_RECT(_rect)		_rect.nX, _rect.nY, _rect.nWidth, _rect.nHeight
/// 颜色参数格式
#define GAF_ARG_COLOUR(_colour)		_colour.nAlpha, _colour.nRed, _colour.nGreen, _colour.nBlue

// ****** 全局常量定义 ******
namespace GAF
{
	/// 全局原点常量
	const Point	g_atOrigin	= {0, 0};
	/// 全局零尺寸常量
	const Size	g_sZero		= {0, 0};
	/// 全局空矩形常量
	const Rect	g_rNull		= {0, 0, 0, 0};

	/// 全局透明色常量
	const Colour	g_cTransparent	= {0, 0, 0, 0};
	/// 全局白色常量
	const Colour	g_cWhite	= {255, 255, 255, 255};
	/// 全局黑色常量
	const Colour	g_cBlack	= {255, 0, 0, 0};
	/// 全局红色常量
	const Colour	g_cRed		= {255, 255, 0, 0};
	/// 全局绿色常量
	const Colour	g_cGreen	= {255, 0, 255, 0};
	/// 全局蓝色常量
	const Colour	g_cBlue		= {255, 0, 0, 255};
}

/// 原点
#define GAF_POINT_ORIGIN		GAF::g_atOrigin
/// 零尺寸
#define GAF_SIZE_ZERO			GAF::g_sZero
/// 空矩形
#define GAF_RECT_NULL			GAF::g_rNull

/// 透明色
#define GAF_COLOUR_TRANSPARENT		GAF::g_cTransparent
/// 白色
#define GAF_COLOUR_WHITE		GAF::g_cWhite
/// 黑色
#define GAF_COLOUR_BLACK		GAF::g_cBlack
/// 红色
#define GAF_COLOUR_RED			GAF::g_cRed
/// 绿色
#define GAF_COLOUR_GREEN		GAF::g_cGreen
/// 蓝色
#define GAF_COLOUR_BLUE			GAF::g_cBlue

#endif
